package com.are.odisea;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class ResolverOrdenMantenimiento
 */
@WebServlet("/SrvResolverOrden")
public class SrvResolverOrden extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public SrvResolverOrden() {
		super();
		// TODO Auto-generated constructor stub
	}

	@SuppressWarnings({ "unchecked", "unused" })
	protected void ProcesarPeticion(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=ISO-8859-1");
		PrintWriter out = response.getWriter();

		HttpSession sesion = request.getSession();
		if (sesion.getAttribute("usuario") == null) {
			out.print("La sesion ha caducado... intente de nuevo por favor");
			return;
		}

		String usuario = (String) sesion.getAttribute("usuario");

		db conexion = null;
		String operacion = (String) request.getParameter("operacion");
		System.out.println("Operacion: " + operacion);
		try {

			if (operacion.equals("mantenimiento")) {
				conexion = new db();
				String cedula = (String) request.getParameter("cedula");
				String orden = (String) request.getParameter("orden");
				String causal = (String) request.getParameter("causal");
				String observacion = (String) request
						.getParameter("observacion");
				String ticket = (String) request.getParameter("ticket");
				String operador = (String) request.getParameter("operador");
				String departamento = (String) request.getParameter("departamento");
				
				GestionPersonal GP = new GestionPersonal(conexion);
				String cuadrilla = GP.getCuadrilla(cedula);
				if (cuadrilla.equals("-1")) {
					throw new SQLException ("No tiene cuadrilla asignada o activa, comunicarse con el administrador del sistema");
				}
				
				ResolverOrden resolver = new ResolverOrden(conexion);
				resolver.setUsuario(usuario);
				boolean result = resolver.ResolverOrdenMantenimiento(orden,
						causal, observacion, ticket, operador, cedula,departamento,cuadrilla,
						ResolverOrden.COMMIT_OFF);
				if (result) {
					// reservando consumos
					boolean pasa_material = true;
					boolean pasa_seriales = true;
					
					ArrayList<ConsumoOrden> consumos = (ArrayList<ConsumoOrden>) sesion
							.getAttribute("consumos");
					System.out.println("Total Productos " + consumos.size());
					if (consumos != null) {
						// Validando cantidad
						for (int j=0; j < consumos.size(); j++) {
							ConsumoOrden item = consumos.get(j);
							if (item.getCantidad() <= 0) {
								throw new SQLException ("Cantidad no permitida para el material " + item.getDescripcion());
							}
						}
						
						for (int i = 0; i < consumos.size(); i++) {
							ConsumoOrden item = consumos.get(i);
							System.out.println("Procesando item "
									+ item.getMaterial());
							GestionConsumos gc = new GestionConsumos(conexion);
							Consumos c = new Consumos();
							c.setId_consumo(Integer.parseInt(item.getId()));
							c.setTipo_consumo(1); // Material
							c.setCedula(cedula);
							c.setCantidad(item.getCantidad());
							c.setEstado(0);
							c.setOrden(orden);
							c.setTipo_orden(GestionConsumos.TIPO_ORDEN_MANTENIMIENTO);
							c.setUsuario(usuario);

							if (!gc.Add(c, GestionConsumos.COMMIT_OFF)) {
								System.out.println("Error. "
										+ item.getMaterial());
								pasa_material = false;
								break;
							}

						}

					}
					// Reservando seriales
					
					ArrayList<ConsumoOrden> seriales = (ArrayList<ConsumoOrden>) sesion
							.getAttribute("seriales");
					System.out.println("Total seriales " + seriales.size());
					if (seriales != null) {
						for (int i = 0; i < seriales.size(); i++) {
							ConsumoOrden item = seriales.get(i);
							System.out.println("Serial procesado "
									+ item.getSerial() );
							System.out.println("ID serial "
									+ item.getId() );
							GestionConsumos gc = new GestionConsumos(conexion);
							Consumos c = new Consumos();
							c.setId_consumo(Integer.parseInt(item.getId()));
							c.setTipo_consumo(2); // Serial
							c.setCedula(cedula);
							c.setCantidad(item.getCantidad());
							c.setEstado(0);
							c.setOrden(orden);
							c.setTipo_orden(GestionConsumos.TIPO_ORDEN_MANTENIMIENTO);
							c.setUsuario(usuario);
							

							if (!gc.Add(c, GestionConsumos.COMMIT_OFF)) {
								System.out.println("Error. "
										+ item.getMaterial());
								pasa_seriales = false;
								break;
							}

						}

					} else {
						throw new SQLException ("Error al procesar lista de seriales");
					}

					if (pasa_material && pasa_seriales) {
						conexion.Commit();
						sesion.setAttribute("consumos", null);
						sesion.setAttribute("seriales", null);
						out.print("OK");
					} else {
						conexion.Rollback();
						out.print("Error al procesar la solicitud");
					}

				}else {
					conexion.Rollback();
					throw new SQLException ("Error al resolver Orden de Servicio");
				}

			}
			
			/*  Resolver Order de Instalacion  */
			
			if (operacion.equals("instalacion")) {
				conexion = new db();
				String cedula = (String) request.getParameter("cedula");
				String orden = (String) request.getParameter("orden");
				String observacion = (String) request.getParameter("observacion");
				String ticket = (String) request.getParameter("ticket");
				String operador = (String) request.getParameter("operador");
				String departamento = (String) request.getParameter("departamento");
				
				String[] producto = request.getParameterValues("producto");
				String[] accion = request.getParameterValues("accion");
				String[] causal = request.getParameterValues("causal");
				
				if (producto.length != accion.length || producto.length != causal.length) {
					throw new SQLException ("Error al procesar los productos de la peticion, verifique por favor");
				}
				
				for (int x=0; x < accion.length; x++) {
					if (accion[x].equals("0") && causal[x].equals("-1")) {
						throw new SQLException ("Debe seleccionar la causal de quiebre del producto " + producto[x]);
					}
				}
				
				String productos = "";
				String estado = "";
				int instalados = 0;
				for (int x=0; x < producto.length; x++) {
					if (accion[x].equals("1")) {
						productos += producto[x];
						causal[x] = "-1";
						instalados++;
					}
				}
				
				if (instalados == 0) {
					estado = "2"; // quiebre
				}else {
					estado = "1"; // alta
				}
				
				
				GestionPersonal GP = new GestionPersonal(conexion);
				String cuadrilla = GP.getCuadrilla(cedula);
				if (cuadrilla.equals("-1")) {
					throw new SQLException ("No tiene cuadrilla asignada o activa, comunicarse con el administrador del sistema");
				}
				
				ResolverOrden resolver = new ResolverOrden(conexion);
				resolver.setUsuario(usuario);
				boolean result = resolver.ResolverOrdenInstalacion(orden, observacion, productos, estado, ticket, operador, cedula, departamento, cuadrilla, ResolverOrden.COMMIT_OFF);
				if (result) {
					
					for (int x=0; x < producto.length; x++) {
						if (!resolver.ReporteProducto(orden, producto[x], accion[x], causal[x], ResolverOrden.COMMIT_OFF)) {
							throw new SQLException ("Error al registrar accion del producto " + producto[x]);
						}
					}
					
					// reservando consumos
					boolean pasa_material = true;
					boolean pasa_seriales = true;
					
					ArrayList<ConsumoOrden> consumos = (ArrayList<ConsumoOrden>) sesion
							.getAttribute("consumos");
					System.out.println("Total Productos " + consumos.size());
					if (consumos != null) {
						// Validando cantidad
						for (int j=0; j < consumos.size(); j++) {
							ConsumoOrden item = consumos.get(j);
							if (item.getCantidad() <= 0) {
								throw new SQLException ("Cantidad no permitida para el material " + item.getDescripcion());
							}
						}
						
						for (int i = 0; i < consumos.size(); i++) {
							ConsumoOrden item = consumos.get(i);
							System.out.println("Procesando item "
									+ item.getMaterial());
							GestionConsumos gc = new GestionConsumos(conexion);
							Consumos c = new Consumos();
							c.setId_consumo(Integer.parseInt(item.getId()));
							c.setTipo_consumo(1); // Material
							c.setCedula(cedula);
							c.setCantidad(item.getCantidad());
							c.setEstado(0);
							c.setOrden(orden);
							c.setTipo_orden(GestionConsumos.TIPO_ORDEN_INSTALACION);
							c.setUsuario(usuario);

							if (!gc.Add(c, GestionConsumos.COMMIT_OFF)) {
								System.out.println("Error. "
										+ item.getMaterial());
								pasa_material = false;
								break;
							}

						}

					}
					// Reservando seriales
					
					ArrayList<ConsumoOrden> seriales = (ArrayList<ConsumoOrden>) sesion
							.getAttribute("seriales");
					System.out.println("Total seriales " + seriales.size());
					if (seriales != null) {
						for (int i = 0; i < seriales.size(); i++) {
							ConsumoOrden item = seriales.get(i);
							System.out.println("Serial procesado "
									+ item.getSerial() );
							System.out.println("ID serial "
									+ item.getId() );
							GestionConsumos gc = new GestionConsumos(conexion);
							Consumos c = new Consumos();
							c.setId_consumo(Integer.parseInt(item.getId()));
							c.setTipo_consumo(2); // Serial
							c.setCedula(cedula);
							c.setCantidad(item.getCantidad());
							c.setEstado(0);
							c.setOrden(orden);
							c.setTipo_orden(GestionConsumos.TIPO_ORDEN_INSTALACION);
							c.setUsuario(usuario);
							

							if (!gc.Add(c, GestionConsumos.COMMIT_OFF)) {
								System.out.println("Error. "
										+ item.getMaterial());
								pasa_seriales = false;
								break;
							}

						}

					} else {
						throw new SQLException ("Error al procesar lista de seriales");
					}

					if (pasa_material && pasa_seriales) {
						conexion.Commit();
						sesion.setAttribute("consumos", null);
						sesion.setAttribute("seriales", null);
						out.print("OK");
					} else {
						conexion.Rollback();
						out.print("Error al procesar la solicitud");
					}

				}else {
					conexion.Rollback();
					throw new SQLException ("Error al resolver Orden de Servicio");
				}

			}
			
			
			
			

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			out.println("Error de conexion. " + e.getMessage());
		} finally {
			if (conexion != null) {
				try {
					conexion.Close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					out.println("Error de conexion. " + e.getMessage());
				}
			}
		}

	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.ProcesarPeticion(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.ProcesarPeticion(request, response);
	}

}
